{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "cdf95fff-922c-4934-8db5-ea24ce3e2c74",
   "metadata": {},
   "source": [
    "# Explorative Data Analysis"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "39b6bc13-af67-47cb-8ec4-5fe27f453fb6",
   "metadata": {},
   "source": [
    "## 总结\n",
    "### a. Train / Test 数据一致性\n",
    "* **见1.2**\n",
    "    * train_df中，Fare没有缺失值；而test_df中，Fare有0.2%的缺失值\n",
    "    * train_df中，Embarked有0.2%的缺失值；而test_df中，Embarked没有缺失值\n",
    "    * Cabin字段缺失值比例大约80%，Age字段缺失值大约20%\n",
    "    * 其余字段无缺失值\n",
    "* **见1.3**\n",
    "    * Ticket和Cabin有大量重复值\n",
    "* **见1.4**\n",
    "    * Age特征中，有很多Age=0的值，影响了数据单峰分布，需要处理\n",
    "    * 可以认为train和test从同一个分布中取出"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e0001289-581c-46ec-979c-e75d0eea7242",
   "metadata": {},
   "source": [
    "## 猜想\n",
    "### Age\n",
    "* 单独处理估计值\n",
    "### Ticket\n",
    "* Ticket有较高重复值，可能意味着有很多乘客是通过同一张票登船的；可以生成*Ticket-isDuplicated*特征来进行验证\n",
    "### Cabin\n",
    "* Cabin为NaN，很可能是底层的船舱，存活概率更低；可以生成*Cabin==Nan*特征来进行验证\n",
    "### Parch\n",
    "* 由于老人小孩的获救概率更高，因此Parch > 0的人生存概率更低"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "id": "ec08083b-d145-40b0-92fa-c6563b27ee4c",
   "metadata": {},
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import re\n",
    "\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "\n",
    "from sklearn.model_selection import train_test_split, KFold\n",
    "from sklearn.metrics import accuracy_score\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.ensemble import RandomForestClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "76092431-caff-476d-b2e5-07511012ef9b",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_df = pd.read_csv('../data/train.csv')\n",
    "test_df = pd.read_csv('../data/test.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6b1f516f-eacc-40b3-9805-ad8ca6ad9cfc",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 12 columns):\n",
      " #   Column       Non-Null Count  Dtype  \n",
      "---  ------       --------------  -----  \n",
      " 0   PassengerId  891 non-null    int64  \n",
      " 1   Survived     891 non-null    int64  \n",
      " 2   Pclass       891 non-null    int64  \n",
      " 3   Name         891 non-null    object \n",
      " 4   Sex          891 non-null    object \n",
      " 5   Age          714 non-null    float64\n",
      " 6   SibSp        891 non-null    int64  \n",
      " 7   Parch        891 non-null    int64  \n",
      " 8   Ticket       891 non-null    object \n",
      " 9   Fare         891 non-null    float64\n",
      " 10  Cabin        204 non-null    object \n",
      " 11  Embarked     889 non-null    object \n",
      "dtypes: float64(2), int64(5), object(5)\n",
      "memory usage: 83.7+ KB\n"
     ]
    }
   ],
   "source": [
    "train_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "21fc7bca-4a0f-4db1-9394-080ebef2a313",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 418 entries, 0 to 417\n",
      "Data columns (total 11 columns):\n",
      " #   Column       Non-Null Count  Dtype  \n",
      "---  ------       --------------  -----  \n",
      " 0   PassengerId  418 non-null    int64  \n",
      " 1   Pclass       418 non-null    int64  \n",
      " 2   Name         418 non-null    object \n",
      " 3   Sex          418 non-null    object \n",
      " 4   Age          332 non-null    float64\n",
      " 5   SibSp        418 non-null    int64  \n",
      " 6   Parch        418 non-null    int64  \n",
      " 7   Ticket       418 non-null    object \n",
      " 8   Fare         417 non-null    float64\n",
      " 9   Cabin        91 non-null     object \n",
      " 10  Embarked     418 non-null    object \n",
      "dtypes: float64(2), int64(4), object(5)\n",
      "memory usage: 36.0+ KB\n"
     ]
    }
   ],
   "source": [
    "test_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "3b50a956-8a98-490e-9eac-e160b14d4a34",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.3838383838383838"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df['Survived'].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aeb6e770-c3cf-4a3a-95e7-f82280e2cdac",
   "metadata": {
    "tags": []
   },
   "source": [
    "<table>\n",
    "<tbody>\n",
    "<tr><th><b>Variable</b></th><th><b>Definition</b></th><th><b>Key</b></th></tr>\n",
    "<tr>\n",
    "<td>survival</td>\n",
    "<td>Survival</td>\n",
    "<td>0 = No, 1 = Yes</td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>pclass</td>\n",
    "<td>Ticket class</td>\n",
    "<td>1 = 1st, 2 = 2nd, 3 = 3rd</td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>sex</td>\n",
    "<td>Sex</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>Age</td>\n",
    "<td>Age in years</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>sibsp</td>\n",
    "<td># of siblings / spouses aboard the Titanic</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>parch</td>\n",
    "<td># of parents / children aboard the Titanic</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>ticket</td>\n",
    "<td>Ticket number</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>fare</td>\n",
    "<td>Passenger fare</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>cabin</td>\n",
    "<td>Cabin number</td>\n",
    "<td></td>\n",
    "</tr>\n",
    "<tr>\n",
    "<td>embarked</td>\n",
    "<td>Port of Embarkation</td>\n",
    "<td>C = Cherbourg, Q = Queenstown, S = Southampton</td>\n",
    "</tr>\n",
    "</tbody>\n",
    "</table>"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "1d3c42df-e846-4c65-95c3-695f88f32ea5",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C85</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>C123</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Cabin Embarked  \n",
       "0      0         A/5 21171   7.2500   NaN        S  \n",
       "1      0          PC 17599  71.2833   C85        C  \n",
       "2      0  STON/O2. 3101282   7.9250   NaN        S  \n",
       "3      0            113803  53.1000  C123        S  \n",
       "4      0            373450   8.0500   NaN        S  "
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "e898d1ec-5fc1-465a-9410-a6874cc0ac98",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>892</td>\n",
       "      <td>3</td>\n",
       "      <td>Kelly, Mr. James</td>\n",
       "      <td>male</td>\n",
       "      <td>34.5</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>330911</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>893</td>\n",
       "      <td>3</td>\n",
       "      <td>Wilkes, Mrs. James (Ellen Needs)</td>\n",
       "      <td>female</td>\n",
       "      <td>47.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>363272</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>894</td>\n",
       "      <td>2</td>\n",
       "      <td>Myles, Mr. Thomas Francis</td>\n",
       "      <td>male</td>\n",
       "      <td>62.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>240276</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>895</td>\n",
       "      <td>3</td>\n",
       "      <td>Wirz, Mr. Albert</td>\n",
       "      <td>male</td>\n",
       "      <td>27.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>315154</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>896</td>\n",
       "      <td>3</td>\n",
       "      <td>Hirvonen, Mrs. Alexander (Helga E Lindqvist)</td>\n",
       "      <td>female</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>3101298</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Pclass                                          Name     Sex  \\\n",
       "0          892       3                              Kelly, Mr. James    male   \n",
       "1          893       3              Wilkes, Mrs. James (Ellen Needs)  female   \n",
       "2          894       2                     Myles, Mr. Thomas Francis    male   \n",
       "3          895       3                              Wirz, Mr. Albert    male   \n",
       "4          896       3  Hirvonen, Mrs. Alexander (Helga E Lindqvist)  female   \n",
       "\n",
       "    Age  SibSp  Parch   Ticket     Fare Cabin Embarked  \n",
       "0  34.5      0      0   330911   7.8292   NaN        Q  \n",
       "1  47.0      1      0   363272   7.0000   NaN        S  \n",
       "2  62.0      0      0   240276   9.6875   NaN        Q  \n",
       "3  27.0      0      0   315154   8.6625   NaN        S  \n",
       "4  22.0      1      1  3101298  12.2875   NaN        S  "
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "be066aaf-16d0-42a5-b6e7-632278008bc0",
   "metadata": {},
   "source": [
    "## 1. 检查数据一致性"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0b8861d9-2818-4f3d-a70f-6d68164752e0",
   "metadata": {},
   "source": [
    "### 1.1 检查PassengerId是否唯一"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "bad12f12-88d9-4c6e-866c-40158349ec3d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "True\n",
      "True\n"
     ]
    }
   ],
   "source": [
    "# train_df\n",
    "print(len(train_df['PassengerId'].unique()) == len(train_df))\n",
    "\n",
    "# test_df\n",
    "print(len(test_df['PassengerId'].unique()) == len(test_df))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "4291c1fa-7248-4272-ae76-edfacdfc6c23",
   "metadata": {},
   "source": [
    "### 1.2 查看缺失值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "8d496a1e-1eaa-4e8d-82f5-d1cb3ff1ea4b",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PassengerId    0.000000\n",
       "Survived       0.000000\n",
       "Pclass         0.000000\n",
       "Name           0.000000\n",
       "Sex            0.000000\n",
       "Age            0.198653\n",
       "SibSp          0.000000\n",
       "Parch          0.000000\n",
       "Ticket         0.000000\n",
       "Fare           0.000000\n",
       "Cabin          0.771044\n",
       "Embarked       0.002245\n",
       "dtype: float64"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df.isnull().sum() / len(train_df)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "41e3bd84-b22f-4e5a-bb30-206fd6ff05d6",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PassengerId    0.000000\n",
       "Pclass         0.000000\n",
       "Name           0.000000\n",
       "Sex            0.000000\n",
       "Age            0.205742\n",
       "SibSp          0.000000\n",
       "Parch          0.000000\n",
       "Ticket         0.000000\n",
       "Fare           0.002392\n",
       "Cabin          0.782297\n",
       "Embarked       0.000000\n",
       "dtype: float64"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.isnull().sum() / len(test_df)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "440eb004-6c48-472c-9cf7-af2ec6ee52e3",
   "metadata": {},
   "source": [
    "### 1.3  查看重复值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "79df8df4-8fd9-4e37-905a-127aca11cf45",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "891\n",
      "418\n"
     ]
    }
   ],
   "source": [
    "# Name\n",
    "# train_df\n",
    "print(len(train_df['Name'].unique()))\n",
    "# test_df\n",
    "print(len(test_df['Name'].unique()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "82aba380-b621-4d79-aec3-356e1fc9a1cf",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "23.57%\n",
      "13.16%\n"
     ]
    }
   ],
   "source": [
    "# Ticket\n",
    "# train_df\n",
    "print('{:.2f}%'.format(100 - 100 * len(train_df['Ticket'].unique()) / len(train_df)))\n",
    "# test_df\n",
    "print('{:.2f}%'.format(100 - 100 * len(test_df['Ticket'].unique()) / len(test_df)))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "57d2e308-13f9-49f2-b8df-2e1bf075f10c",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "27.45%\n",
      "15.38%\n"
     ]
    }
   ],
   "source": [
    "# Cabin\n",
    "# train_df\n",
    "print('{:.2f}%'.format(100 - 100 * len(train_df['Cabin'].unique()) / train_df.notnull().sum()['Cabin']))\n",
    "# test_df\n",
    "print('{:.2f}%'.format(100 - 100 * len(test_df['Cabin'].unique()) / test_df.notnull().sum()['Cabin']))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "34989fd3-072f-44a0-8227-45f253da766b",
   "metadata": {},
   "source": [
    "### 1.4 检查是否从同一分布中抽出"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "a1c3a434-b140-4bfd-9b20-7c0df349171d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc7169c1ee0>"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAsVUlEQVR4nO3de3hV1Z3G8feQKxCSAJGE1AAJWCSCIomlSY14ocFAnaI4IlUEUZ5GbbmkVATaUakSq0yLKJdHxQtjqzwzQUtnQiVUEqlEEZoghUx0NJAIiWlwSLhoAsmaPxxOPeTkcg4JZ53D9/M856lZe+29149jyevae6/tMMYYAQAAWKyHrwcAAADQEQILAACwHoEFAABYj8ACAACsR2ABAADWI7AAAADrEVgAAID1CCwAAMB6wb4eQFdpaWnR4cOH1adPHzkcDl8PBwAAdIIxRseOHVN8fLx69Gh7HiVgAsvhw4eVkJDg62EAAAAvVFVV6eKLL25ze8AElj59+kj6uuDIyEgfjwYAAHRGQ0ODEhISnL/H2xIwgeXMZaDIyEgCCwAAfqaj2zm46RYAAFiPwAIAAKxHYAEAANYLmHtYAAAwxuj06dNqbm729VDw/4KCghQcHHzOS44QWAAAAaGpqUnV1dU6efKkr4eCs/Tq1UsDBw5UaGio18cgsAAA/F5LS4sqKioUFBSk+Ph4hYaGsoioBYwxampq0t///ndVVFTokksuaXdxuPYQWAAAfq+pqUktLS1KSEhQr169fD0cfEPPnj0VEhKigwcPqqmpSeHh4V4dh5tuAQABw9v/ekf36orvhW8WAABYj8ACAACsxz0sAICAtnX/5+f1fOOTY8/r+b5pyJAhmjdvnubNm9ctxy8sLNR1112n//3f/1V0dLQk6c0339SCBQtUUVGhn/70p1qxYkW3nJvAAgCAD1177bUaPXp0l/yi/+CDD9S7d+9zH5QHfvzjH+vuu+/WnDlzOnyB4bkgsAAAYDFjjJqbmxUc3PGv7Isuuug8jOgfjh8/rtraWk2YMEHx8fHdei7uYQEAwEdmzpypoqIiPf3003I4HHI4HHr55ZflcDj01ltvKTU1VWFhYdq+fbs++eQT/fCHP1RsbKwiIiJ01VVXaevWrS7HGzJkiMtMjcPh0AsvvKCbb75ZvXr10iWXXKJNmzZ1enz5+fn69re/rZ49e+q6667TgQMHnNsKCwudMyrXX3+9HA6HCgsLz+WPo13MsACdUb7Zu/2GZ3XtOAAElKefflofffSRRo4cqaVLl0qS9u3bJ0l68MEHtXz5ciUlJSk6OlqfffaZJk6cqMcee0zh4eF65ZVXdNNNN6m8vFyDBg1q8xyPPvqonnzyST311FN65plndMcdd+jgwYPq169fu2OrqqrSLbfcouzsbN13333atWuXfvaznzm3p6enq7y8XMOHD1deXp7S09M7POa5YIYFAAAfiYqKUmhoqHr16qW4uDjFxcUpKChIkrR06VJ9//vf19ChQ9W/f39dccUV+vGPf6xRo0bpkksu0WOPPaakpKQOZ0xmzpypadOmadiwYVq2bJlOnDihnTt3dji2NWvWKCkpSb/97W81fPhw3XHHHZo5c6Zze2hoqAYMGCBJ6tevn+Li4s5p6f2OEFgAALBQamqqy88nTpzQgw8+qOTkZEVHRysiIkL//d//rcrKynaPc/nllzv/uXfv3urTp49qa2s7PH9ZWZm++93vurziIC0tzcMqug6XhAAAsNDZT/v8/Oc/11tvvaXly5dr2LBh6tmzp2699VY1NTW1e5yQkBCXnx0Oh1paWjo8vzHG80F3IwILAAA+FBoaqubm5g77bd++XTNnztTNN98s6esndL55E2xXS05O1ptvvunS9t5773Xb+TrCJSEAAHxoyJAhev/993XgwAHV1dW1OfsxbNgwbdy4UaWlpdqzZ49+9KMfdWqmxFvZ2dn65JNPlJOTo/Lycv3+97/Xyy+/3G3n6wgzLACAgObLlWc7Y8GCBZoxY4aSk5P15Zdf6qWXXnLb77e//a1mzZql9PR0xcTEaOHChWpoaOi2cQ0aNEh5eXmaP3++Vq9ere985ztatmyZZs2a1W3nbI/D2HaRyksNDQ2KiopSfX29IiMjfT0cBBoeawas9tVXX6miokKJiYkKDw/39XBwlva+n87+/uaSEAAAsB6BBQCAC1B2drYiIiLcfrKzs309vFa4hwUAgAvQ0qVLtWDBArfbbLy1gsACAMAFaMCAAc6Vav0Bl4QAAID1CCwAAMB6BBYAAGA9AgsAALAegQUAAFiPwAIAAFwcOHBADodDpaWlzrZ3331Xo0aNUkhIiCZPnnzex8RjzQCAwObtqzW85eErOa699lqNHj1aK1as6JLTz5w5U0ePHm31puVzlZOTo9GjR2vz5s2KiIjo0mN3BjMsAACgQ5988omuv/56XXzxxYqOjj7v5yewAADgIzNnzlRRUZGefvppORwOORwOHThwQPv379fEiRMVERGh2NhYTZ8+XXV1dc79/uM//kOjRo1Sz5491b9/f40fP14nTpzQI488oldeeUV/+MMfnMcrLCzscBw7d+7UlVdeqfDwcKWmpqqkpMS57czloSNHjmjWrFlyOBx6+eWXu+FPo30EFgAAfOTpp59WWlqaZs+ererqalVXVyskJETjxo3T6NGjtWvXLv3pT3/S559/rttuu02SVF1drWnTpmnWrFkqKytTYWGhbrnlFhljtGDBAt1222268cYbncdLT09vdwwnTpzQD37wAw0fPly7d+/WI4884rJkf0JCgqqrqxUZGakVK1aourpaU6dO7dY/F3e4hwUAAB+JiopSaGioevXqpbi4OEnSv/zLv2jMmDFatmyZs9+LL76ohIQEffTRRzp+/LhOnz6tW265RYMHD5YkjRo1ytm3Z8+eamxsdB6vI7/73e/U3NysF198Ub169dJll12mzz77TPfdd58kKSgoSHFxcXI4HIqKiur0cbsagQUAAIvs3r1b27Ztc3tj6yeffKLMzEzdcMMNGjVqlCZMmKDMzEzdeuut6tu3r1fnKysr0xVXXKFevXo529LS0rwef3fhkhAAABZpaWnRTTfdpNLSUpfPxx9/rGuuuUZBQUEqKCjQ5s2blZycrGeeeUbDhw9XRUWFV+czxnRxBd2DwAIAgA+FhoaqubnZ+fOYMWO0b98+DRkyRMOGDXP59O7dW5LkcDj0ve99T48++qhKSkoUGhqqN954w+3xOpKcnKw9e/boyy+/dLa99957XVRd1yGwAADgQ0OGDNH777+vAwcOqK6uTg888IC++OILTZs2TTt37tSnn36qLVu2aNasWWpubtb777+vZcuWadeuXaqsrNTGjRv197//XSNGjHAe78MPP1R5ebnq6up06tSpds//ox/9SD169NA999yj/fv3Kz8/X8uXLz8fpXuEe1gAAIHNw4XczrcFCxZoxowZSk5O1pdffqmKigq9++67WrhwoSZMmKDGxkYNHjxYN954o3r06KHIyEi98847WrFihRoaGjR48GD967/+q7Kyvq5z9uzZKiwsVGpqqo4fP65t27bp2muvbfP8ERER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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Age\n",
    "plt.figure()\n",
    "plt.hist(train_df['Age'], density = True, bins = 30, alpha = 0.3, label = 'train_df')\n",
    "plt.hist(test_df['Age'], density = True, bins = 30, alpha = 0.3, label = 'test_df')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "ab18894d-c7ad-49a2-81c7-14d980264427",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc716ecb340>"
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjUAAAGdCAYAAADqsoKGAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAz50lEQVR4nO3de1TVdb7/8deWq6LgBQMpVNAyL5S5d0Mwh6yJIKxOFq6IaZldxjXUlCF5MnU6mTnSxdOYKXosLZnOmOscrDwrSrAJstxaEpgp43iSQm0Ts52JnVqg+P394c9dO7bA5iLw5flY67tW+7Pf3+/nsz9ovPx8L9tiGIYhAACAHq5PVw8AAACgIxBqAACAKRBqAACAKRBqAACAKRBqAACAKRBqAACAKRBqAACAKRBqAACAKfh39QDOp9OnT+vrr7/WgAEDZLFYuno4AACgFQzD0HfffaeoqCj16XPu9ZheFWq+/vprRUdHd/UwAABAGxw6dEgXXXTROd/vVaFmwIABks5MSmhoaBePBgAAtIbL5VJ0dLT79/i59KpQc/aUU2hoKKEGAIAepqVLR7hQGAAAmAKhBgAAmAKhBgAAmEKvuqYGAADDMHTq1Ck1NjZ29VDw//n5+cnf37/dj1sh1AAAeo2GhgY5HA6dOHGiq4eCn+nXr5+GDRumwMDANh+DUAMA6BVOnz6tqqoq+fn5KSoqSoGBgTyItRswDEMNDQ36+9//rqqqKl188cXNPmCvOYQaAECv0NDQoNOnTys6Olr9+vXr6uHgJ/r27auAgAB99dVXamhoUHBwcJuOw4XCAIBepa2rAOhcHfFz4ScLAABMgVADAABMgWtqAAC93tZ935zX/pLHRZzX/n5q5MiRys7OVnZ2dqccv6SkRNdee63++c9/auDAgZKkN998U3PmzFFVVZUeeughLVu2rFP6JtQAANDNXXPNNZo4cWKHhIFPPvlEISEh7R+UD37729/qnnvu0axZs1r8Usr2INQAANDDGYahxsZG+fu3/Gt96NCh52FEPzp27Jhqa2uVmpqqqKioTu2La2oAAOjG7r77bpWWluqFF16QxWKRxWLRq6++KovFoi1btshmsykoKEjbtm3TF198oVtuuUURERHq37+/rrzySm3dutXjeCNHjvRY8bFYLHr55Zd16623ql+/frr44ou1efPmVo+vsLBQl1xyifr27atrr71WX375pfu9kpIS98rMr371K1ksFpWUlLRnOprFSk0Hac352K48hwoA6JleeOEF/e1vf9OECRO0aNEiSdLevXslSY8++qiWLl2q2NhYDRw4UIcPH9aUKVO0ePFiBQcHa/369br55pu1f/9+DR8+/Jx9PPnkk3r22Wf13HPP6cUXX9Sdd96pr776SoMHD252bIcOHdJtt92mrKws3X///dq1a5ceeeQR9/uJiYnav3+/xowZo4KCAiUmJrZ4zPZgpQYAgG4sLCxMgYGB6tevnyIjIxUZGSk/Pz9J0qJFi3T99ddr1KhRGjJkiC6//HL99re/VVxcnC6++GItXrxYsbGxLa683H333crMzNTo0aO1ZMkSHT9+XB9//HGLY1u1apViY2P1xz/+UWPGjNGdd96pu+++2/1+YGCgLrjgAknS4MGDFRkZ2a6vQWgJoQYAgB7KZrN5vD5+/LgeffRRjRs3TgMHDlT//v3117/+VdXV1c0e57LLLnP/d0hIiAYMGKDa2toW+6+srNRVV13l8XUTCQkJPn6KjsPpJwAAeqif38X0b//2b9qyZYuWLl2q0aNHq2/fvpo2bZoaGhqaPU5AQIDHa4vFotOnT7fYv2EYvg+6ExFqAADo5gIDA9XY2Nhi3bZt23T33Xfr1ltvlXTmzqOfXrjb0caNG6c333zTo23Hjh2d1l9LOP0EAEA3N3LkSO3cuVNffvmlnE7nOVdRRo8erU2bNqmiokK7d+/Wr3/961atuLRVVlaWvvjiC+Xk5Gj//v3685//rFdffbXT+msJKzUdJPzrv7RcNC6z8wcCAPBZd787dc6cOZoxY4bGjRun77//Xq+88orXuj/+8Y+69957lZiYqPDwcM2dO1cul6vTxjV8+HAVFBRo9uzZysvL0y9+8QstWbJE9957b6f12RyL0d1OiHUil8ulsLAw1dXVKTQ0tEOPXbF1Q4s1E5MJNQDQVX744QdVVVUpJiZGwcHBXT0c/ExzP5/W/v7m9BMAADAFQg0AAPAqKytL/fv397plZWV19fCa4JoaAADg1aJFizRnzhyv73X0ZRwdgVADAAC8uuCCC9xPBO4JOP0EAABMgVADAABMoU2hJi8vz33LldVq1bZt25qtLy0tldVqVXBwsGJjY7V69WqP9zdt2iSbzaaBAwcqJCREEydO1J/+9CePmoULF7q/cv3sFhkZ2ZbhAwAAE/I51GzcuFHZ2dlasGCBysvLlZSUpLS0tHN+WVZVVZWmTJmipKQklZeXa/78+Zo1a5YKCgrcNYMHD9aCBQtkt9v12Wef6Z577tE999yjLVu2eBxr/Pjxcjgc7m3Pnj2+Dh8AAJiUzxcKP//887rvvvv0m9/8RpK0bNkybdmyRatWrVJubm6T+tWrV2v48OFatmyZJGns2LHatWuXli5dqvT0dEnSNddc47HPww8/rPXr1+vDDz9Uamrqj4P192d1BgAAeOXTSk1DQ4PKysqUkpLi0Z6SkqLt27d73cdutzepT01N1a5du3Ty5Mkm9YZh6L333tP+/ft19dVXe7x34MABRUVFKSYmRnfccYcOHjzoy/ABAEAH+fLLL2WxWFRRUeFu++ijjxQXF6eAgABNnTr1vI/Jp5Uap9OpxsZGRUR4fkdGRESEampqvO5TU1Pjtf7UqVNyOp0aNmyYJKmurk4XXnih6uvr5efnp7y8PF1//fXufeLj45Wfn69LLrlE33zzjRYvXqzExETt3btXQ4YM8dp3fX296uvr3a878/svAAA92P53zm9/Y9J8Kr/mmms0ceJE91mP9rr77rv17bffNvmG7fbKycnRxIkT9c4776h///4deuzWaNNzaiwWi8drwzCatLVU//P2AQMGqKKiQseOHdN7772nnJwcxcbGuk9NpaX9+AcgLi5OCQkJGjVqlNavX6+cnByv/ebm5urJJ5/06bMBAIC2+eKLL5SVlaWLLrqoS/r36fRTeHi4/Pz8mqzK1NbWNlmNOSsyMtJrvb+/v8cKS58+fTR69GhNnDhRjzzyiKZNm+b1Gp2zQkJCFBcXpwMHDpyzZt68eaqrq3Nvhw4das3HBACg27j77rtVWlqqF154wX3375dffql9+/ZpypQp6t+/vyIiIjR9+nQ5nU73fv/zP/+juLg49e3bV0OGDFFycrKOHz+uhQsXav369XrrrbfcxyspKWlxHB9//LGuuOIKBQcHy2azqby83P3e2VNRR48e1b333iuLxaJXX321E2ajeT6FmsDAQFmtVhUXF3u0FxcXKzEx0es+CQkJTeqLiopks9kUEBBwzr4Mw/A4dfRz9fX1qqysdJ++8iYoKEihoaEeGwAAPckLL7yghIQEzZw50333b0BAgCZPnqyJEydq165devfdd/XNN9/o9ttvlyQ5HA5lZmbq3nvvVWVlpUpKSnTbbbfJMAzNmTNHt99+u2644Qb38c71O/ys48eP66abbtKYMWNUVlamhQsXenx9QnR0tBwOh0JDQ7Vs2TI5HA5lZGR06rx44/Ppp5ycHE2fPl02m00JCQlas2aNqqur3V9sNW/ePB05ckT5+fmSznwZ1ooVK5STk6OZM2fKbrdr7dq12rBhg/uYubm5stlsGjVqlBoaGlRYWKj8/HytWrXKXTNnzhzdfPPNGj58uGpra7V48WK5XC7NmDGjvXMAAEC3FRYWpsDAQPXr1899B/C///u/a9KkSVqyZIm7bt26dYqOjtbf/vY3HTt2TKdOndJtt92mESNGSDpz6cZZffv2VX19favvKP6v//ovNTY2at26derXr5/Gjx+vw4cP6/7775ck+fn5KTIyUhaLRWFhYV12p7LPoSYjI0NHjx7VokWL5HA4NGHCBBUWFronzeFweDyzJiYmRoWFhZo9e7ZWrlypqKgoLV++3H07t3QmAT7wwAM6fPiw+vbtq0svvVSvvfaaR8o7fPiwMjMz5XQ6NXToUF111VXasWOHu18AAHqLsrIyvf/++14vxv3iiy+UkpKi6667TnFxcUpNTVVKSoqmTZumQYMGtam/yspKXX755erXr5+7LSEhoc3j7yxtulD4gQce0AMPPOD1PW/n0CZPnqxPP/30nMdbvHixFi9e3Gyfr7/+uk9jBADArE6fPq2bb75ZzzzzTJP3hg0bJj8/PxUXF2v79u0qKirSiy++qAULFmjnzp2KiYnxub+zN/h0d3z3EwAA3VxgYKAaGxvdrydNmqS9e/dq5MiRGj16tMcWEhIi6cwdxr/85S/15JNPqry8XIGBgXrjjTe8Hq8l48aN0+7du/X999+723bs2NFBn67jEGoAAOjmRo4cqZ07d+rLL7+U0+nU7373O/3jH/9QZmamPv74Yx08eFBFRUW699571djYqJ07d2rJkiXatWuXqqurtWnTJv3973/X2LFj3cf77LPPtH//fjmdTq8Pw/2pX//61+rTp4/uu+8+7du3T4WFhVq6dOn5+Og+adPpJwAATMXHh+Gdb3PmzNGMGTM0btw4ff/996qqqtJHH32kuXPnKjU1VfX19RoxYoRuuOEG9enTR6Ghofrggw+0bNkyuVwujRgxQv/xH//hfubbzJkzVVJSIpvNpmPHjun9999v8pVFP9W/f3/97//+r7KysnTFFVdo3LhxeuaZZzyuj+0OLEZPOVHWAVwul8LCwlRXV9fht3dXbN3QYs3E5MwO7RMA0Ho//PCDqqqqFBMTo+Dg4K4eDn6muZ9Pa39/c/oJAACYAqEGAIBebsmSJerfv7/X7adfU9TdcU0NAAC9XFZWlvtpxD/Xt2/f8zyatiPUAADQyw0ePFiDBw/u6mG0G6efAAC9Si+6P6ZH6YifC6EGANArnP0S5RMnTnTxSODN2Z9Lc1923RJOPwEAegU/Pz8NHDhQtbW1kqR+/frJYrF08ahgGIZOnDih2tpaDRw4UH5+fm0+FqEGANBrnP326LPBBt3HwIED2/3t3oQaAECvYbFYNGzYMF1wwQUtfjUAzp+AgIB2rdCcRagBAPQ6fn5+HfJLFN0LFwoDAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTINQAAABTaFOoycvLU0xMjIKDg2W1WrVt27Zm60tLS2W1WhUcHKzY2FitXr3a4/1NmzbJZrNp4MCBCgkJ0cSJE/WnP/2p3f0CAIDew+dQs3HjRmVnZ2vBggUqLy9XUlKS0tLSVF1d7bW+qqpKU6ZMUVJSksrLyzV//nzNmjVLBQUF7prBgwdrwYIFstvt+uyzz3TPPffonnvu0ZYtW9rcLwAA6F0shmEYvuwQHx+vSZMmadWqVe62sWPHaurUqcrNzW1SP3fuXG3evFmVlZXutqysLO3evVt2u/2c/UyaNEk33nijnnrqqTb1643L5VJYWJjq6uoUGhraqn1aq2LrhhZrJiZndmifAAD0Bq39/e3TSk1DQ4PKysqUkpLi0Z6SkqLt27d73cdutzepT01N1a5du3Ty5Mkm9YZh6L333tP+/ft19dVXt7lfSaqvr5fL5fLYAACAOfkUapxOpxobGxUREeHRHhERoZqaGq/71NTUeK0/deqUnE6nu62urk79+/dXYGCgbrzxRr344ou6/vrr29yvJOXm5iosLMy9RUdH+/JxAQBAD9KmC4UtFovHa8MwmrS1VP/z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\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Fare\n",
    "plt.figure()\n",
    "plt.hist(train_df['Fare'], density = True, bins = 50, alpha = 0.3, label = 'train_df')\n",
    "plt.hist(test_df['Fare'], density = True, bins = 50, alpha = 0.3, label = 'test_df')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "id": "71944c5e-3bca-427e-b06b-4c00b1aa5d78",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc716f7a3a0>"
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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NTV67733dN99913VFY6+ysrK0ieffKKcnBzV1dVp586d2r59+4CN15trfs+IZVlu8zv+Umpqql555RW3bQcPHlRKSsoV54sAAHC1TL4R9Wrk5uZq6dKlSkhI0Pnz57Vt27Zu2/3617/W8uXLNXPmTI0ZM0aPPfbYgM6XjI2NVWlpqdasWaPNmzfrO9/5jvLz87V8+fIBG7MnNsuDG0dr165Venq6YmJidPbsWf32t7/V008/rddee0133nmn8vLydObMGb344ouSvn20d8qUKfrxj3+sFStW6OjRo8rKytJLL73k0dM0TqdTdrtdra2t/X6VpObQS722SVqwpF/HBAB45ptvvlF9fb3i4uL6/DP1GBg9/W2u9vzt0ZWRzz//XA888IAcDofsdrumTZvmCiKS5HA43Gb+xsXFaf/+/VqzZo1eeOEFRUdH67nnnuOxXgAA4OJRGNmyZUuPn3d3v2nu3Ll69913PSoKAAD0XVZWlnbs2NHtZ/fff/+Qexs6v00DAICXWb9+vXJzc7v9bCg+FEIYAQDAy4SHh7veoDocePxoLwAAQH8ijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAABwHTl16pRsNptqampc2958801NnTpVfn5+WrRo0aDXxKO9AIDhq+7A4I4Xn+5R83nz5ikpKUmFhYX9MvyyZcv05z//WXv37u2X/V2Sk5OjpKQkHThwQCNHjuzXfV8NrowAAHCd++STT3THHXdo3LhxGjVq1KCPTxgBAGAALFu2TBUVFdq4caNsNptsNptOnTqlkydPKiMjQyNHjlRERIQeeOABtbS0uPr993//t6ZOnaqgoCCFhYVpwYIFamtr05NPPqn/+I//0Msvv+zaX3l5ea91HD9+XDNmzFBgYKBSUlJUXV3t+uzSLZsvv/xSy5cvl81m6/anXQYaYQQAgAGwceNGpaamasWKFXI4HHI4HPLz89PcuXOVlJSkyspKvfbaa/r88891zz33SPr2B2eXLFmi5cuXq7a2VuXl5br77rtlWZZyc3N1zz336K677nLtb+bMmT3W0NbWpr/7u79TfHy8qqqq9OSTT7q9Jj4mJkYOh0OhoaEqLCyUw+HQvffeO6DHpTvMGQEAYADY7Xb5+/srODhYkZGRkqR//ud/1s0336z8/HxXu61btyomJkYfffSRzp07p87OTt19990a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qaioUHZ2to4dO6aysjJ1dnYqLS1NbW1tV+xTX1+vjIwMzZ49W9XV1Vq7dq1WrVql0tLSay4eAAAMf76eNH7ttdfc1rdt26bw8HBVVVVpzpw53fYpLi5WbGysCgsLJUmTJ09WZWWlNmzYoMWLF/etagAA4DWuac5Ia2urJGn06NFXbHP06FGlpaW5bVu4cKEqKyt14cKFaxkeAAB4AY+ujPwly7KUk5OjWbNmacqUKVds19TUpIiICLdtERER6uzsVEtLi6Kioi7r097ervb2dte60+nsa5kAAGCI6/OVkUceeUTvv/++XnrppV7b2mw2t3XLsrrdfklBQYHsdrtriYmJ6WuZAABgiOtTGFm5cqX27dunw4cPa9y4cT22jYyMVFNTk9u25uZm+fr6KiwsrNs+eXl5am1tdS2NjY19KRMAAAwDHt2msSxLK1eu1J49e1ReXq64uLhe+6SmpuqVV15x23bw4EGlpKTIz8+v2z4BAQEKCAjwpDQAADBMeXRlJDs7Wzt27NDOnTsVEhKipqYmNTU16fz58642eXl5evDBB13rWVlZOn36tHJyclRbW6utW7dqy5Ytys3N7b9vAQAAhi2PwkhRUZFaW1s1b948RUVFuZZdu3a52jgcDjU0NLjW4+LitH//fpWXlyspKUn/8i//oueee47HegEAgKQ+3Kbpzfbt2y/bNnfuXL377rueDAUAAK4T/DYNAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKI/DyJEjR5SZmano6GjZbDbt3bu3x/bl5eWy2WyXLR9++GFfawYAAF7E19MObW1tmj59un70ox9p8eLFV92vrq5OoaGhrvWxY8d6OjQAAPBCHoeR9PR0paenezxQeHi4Ro0a5XE/AADg3QZtzsiMGTMUFRWl+fPn6/Dhwz22bW9vl9PpdFsAAIB3GvAwEhUVpZKSEpWWlmr37t2Kj4/X/PnzdeTIkSv2KSgokN1udy0xMTEDXSYAADDEZlmW1efONpv27NmjRYsWedQvMzNTNptN+/bt6/bz9vZ2tbe3u9adTqdiYmLU2trqNu+kP9QceqnXNkkLlvTrmAAAXA+cTqfsdnuv528jj/beeuut+vjjj6/4eUBAgEJDQ90WAADgnYyEkerqakVFRZkYGgAADDEeP01z7tw5/eEPf3Ct19fXq6amRqNHj1ZsbKzy8vJ05swZvfjii5KkwsJCTZgwQYmJiero6NCOHTtUWlqq0tLS/vsWAABg2PI4jFRWVur22293refk5EiSli5dqu3bt8vhcKihocH1eUdHh3Jzc3XmzBkFBQUpMTFRr776qjIyMvqhfAAAMNxd0wTWwXK1E2D6ggmsAAAMjCE9gRUAAOASwggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACMIowAAACjCCMAAMAowggAADCKMAIAAIwijAAAAKMIIwAAwCjCCAAAMIowAgAAjCKMAAAAowgjAADAKMIIAAAwijACAACM8jiMHDlyRJmZmYqOjpbNZtPevXt77VNRUaHk5GQFBgZq4sSJKi4u7kutAADAC3kcRtra2jR9+nRt2rTpqtrX19crIyNDs2fPVnV1tdauXatVq1aptLTU42IBAID38fW0Q3p6utLT06+6fXFxsWJjY1VYWChJmjx5siorK7VhwwYtXrzY0+EBAICXGfA5I0ePHlVaWprbtoULF6qyslIXLlzotk97e7ucTqfbAgAAvNOAh5GmpiZFRES4bYuIiFBnZ6daWlq67VNQUCC73e5aYmJiBrpMAABgyKA8TWOz2dzWLcvqdvsleXl5am1tdS2NjY0DXiMAADDD4zkjnoqMjFRT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NWuW6TK83ne/+11r+fLlbtvuvvtu6/777zdUkfeRZO3Zs8e1fvHiRSsyMtJ6+umnXdu++eYby263W8XFxQNez3V5ZaSjo0NVVVVKS0tz256Wlqa33nrLUFXer7W1VZI0evRow5V4p+zsbH33u9/VggULTJfitfbt26eUlBT9/d//vcLDwzVjxgz9+7//u+myvM6sWbP0v//7v/roo48kSe+9957eeOMNZWRkGK7Me9XX16upqcntvBgQEKC5c+cOynmxT7/aO9y1tLSoq6vrsh/3i4iIuOxH/dA/LMtSTk6OZs2apSlTppgux+v89re/1bvvvqt33nnHdCle7Y9//KOKioqUk5OjtWvX6vjx41q1apUCAgLcfgYD1+axxx5Ta2urbrrpJvn4+Kirq0tPPfWUlixZYro0r3Xp3NfdefH06dMDPv51GUYusdlsbuuWZV22Df3jkUce0fvvv6833njDdClep7GxUY8++qgOHjyowMBA0+V4tYsXLyolJUX5+fmSpBkzZujEiRMqKioijPSjXbt2aceOHdq5c6cSExNVU1Oj1atXKzo6WkuXLjVdnlczdV68LsPImDFj5OPjc9lVkObm5stSIa7dypUrtW/fPh05ckTjxo0zXY7XqaqqUnNzs5KTk13burq6dOTIEW3atEnt7e3y8fExWKH3iIqKUkJCgtu2yZMnq7S01FBF3umnP/2pHn/8cf3DP/yDJGnq1Kk6ffq0CgoKCCMDJDIyUtK3V0iioqJc2wfrvHhdzhnx9/dXcnKyysrK3LaXlZVp5syZhqryPpZl6ZFHHtHu3bv1+9//XnFxcaZL8krz58/XBx98oJqaGteSkpKiH/7wh6qpqSGI9KPbbrvtssfTP/roI9cPhaJ/fP311xoxwv305OPjw6O9AyguLk6RkZFu58WOjg5VVFQMynnxurwyIkk5OTl64IEHlJKSotTUVJWUlKihoUFZWVmmS/Ma2dnZ2rlzp15++WWFhIS4rkTZ7XYFBQUZrs57hISEXDYP54YbblBYWBjzc/rZmjVrNHPmTOXn5+uee+7R8ePHVVJSopKSEtOleZXMzEw99dRTio2NVWJioqqrq/Xss89q+fLlpksb1s6dO6c//OEPrvX6+nrV1NRo9OjRio2N1erVq5Wfn69JkyZp0qRJys/PV3BwsO67776BL27An9cZwl544QVr/Pjxlr+/v3XzzTfzyGk/k9Ttsm3bNtOleT0e7R04r7zyijVlyhQrICDAuummm6ySkhLTJXkdp9NpPfroo1ZsbKwVGBhoTZw40XriiSes9vZ206UNa4cPH+72v8lLly61LOvbx3t//vOfW5GRkVZAQIA1Z84c64MPPhiU2myWZVkDH3kAAAC6d13OGQEAAEMHYQQAABhFGAEAAEYRRgAAgFGEEQAAYBRhBAAAGEUYAQAARhFGAACAUYQRAABgFGEEAAAYRRgBAABGEUYAAIBR/w8TRD+4YkD1HQAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# SibSp + Parch\n",
    "plt.figure()\n",
    "plt.hist(train_df['SibSp'] + train_df['Parch'], density = True, bins = 50, alpha = 0.3, label = 'train_df')\n",
    "plt.hist(test_df['SibSp'] + test_df['Parch'], density = True, bins = 50, alpha = 0.3, label = 'test_df')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "id": "d0d7f6e0-130f-49c3-92df-a84cca69ed6d",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.35241301907968575\n",
      "0.36363636363636365\n"
     ]
    }
   ],
   "source": [
    "# Sex\n",
    "# train_df\n",
    "print(len(train_df[train_df['Sex'] == 'female']) / len(train_df))\n",
    "# test_df\n",
    "print(len(test_df[test_df['Sex'] == 'female']) / len(test_df))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "id": "eb28bab1-5da5-425f-a48a-87c92c6b25a8",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.18855218855218855\n",
      "0.24401913875598086\n",
      "\n",
      "\n",
      "0.08641975308641975\n",
      "0.11004784688995216\n"
     ]
    }
   ],
   "source": [
    "# Embarked - C\n",
    "# train_df\n",
    "print(len(train_df[train_df['Embarked'] == 'C']) / len(train_df))\n",
    "# test_df\n",
    "print(len(test_df[test_df['Embarked'] == 'C']) / len(test_df))\n",
    "\n",
    "print('\\n')\n",
    "\n",
    "# Embarked - Q\n",
    "# train_df\n",
    "print(len(train_df[train_df['Embarked'] == 'Q']) / len(train_df))\n",
    "# test_df\n",
    "print(len(test_df[test_df['Embarked'] == 'Q']) / len(test_df))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f7c1675e-3c33-49ff-ae49-1dfc6eee18c4",
   "metadata": {},
   "source": [
    "## 2. 特征衍生"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c5f231a6-b21d-4aa1-b627-5076c40e2d4e",
   "metadata": {},
   "source": [
    "### 2.1 Sex"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "id": "9431e3c2-01fd-47ac-960c-a3571a79e4cb",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sex</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>female</th>\n",
       "      <td>0.742038</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>male</th>\n",
       "      <td>0.188908</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "        Survived\n",
       "Sex             \n",
       "female  0.742038\n",
       "male    0.188908"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查Sex特征是否对Survived有显著影响\n",
    "(train_df\n",
    "    .groupby('Sex')\n",
    "    .agg({'Survived': np.mean}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "id": "536c7854-ece3-4c82-affe-11b013a6a9b6",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成Sex二值变量\n",
    "train_df['Sex==Female'] = pd.get_dummies(train_df['Sex'])['female']\n",
    "test_df['Sex==Female'] = pd.get_dummies(test_df['Sex'])['female']"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0d34a2f4-c55e-4bf9-a6e6-c5b0a6d4dcf0",
   "metadata": {},
   "source": [
    "### 2.2 Age"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "id": "fb01a686-ef11-4d1b-a165-4b19eeca476d",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<seaborn.axisgrid.FacetGrid at 0x7fc717285610>"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 600x300 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 考虑Age对Survived的非线性影响：老人孩子先走\n",
    "g = sns.FacetGrid(train_df, col = 'Survived')\n",
    "g.map(plt.hist, 'Age', density = True, bins = 20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "id": "71656924-7262-4005-a63e-f6778ffc2213",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x7fc7173d3580>"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAiwAAAGdCAYAAAAxCSikAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/NK7nSAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAyXElEQVR4nO3de1xVdb7/8feW21ZQKDGQQgW7iHkdsAmNsFI8WJ2cPGaGpqM4Q05HgelUaj00u9DFjCyVyUzHUuNM2mVOVGKl2UiWCmXq0S4kjEKEM4LpKArr94c/92m7N5eNF75sX8/HYz+m/V3ftfb3g1ze811rfZfNsixLAAAABmvT0gMAAABoDIEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA835YewNlSV1en/fv3q3379rLZbC09HAAA0ASWZenQoUOKiIhQmzb1z6N4TWDZv3+/IiMjW3oYAACgGUpLS3XZZZfVu91rAkv79u0lnSy4Q4cOLTwaAADQFNXV1YqMjHT8Ha+P1wSWU6eBOnToQGABAKCVaexyDi66BQAAxiOwAAAA4xFYAACA8bzmGhYAQMuyLEsnTpxQbW1tSw8FBvHx8ZGvr+8ZLzlCYAEAnLGamhqVlZXpyJEjLT0UGKhdu3bq3Lmz/P39m30MAgsA4IzU1dWpuLhYPj4+ioiIkL+/Pwt4QtLJWbeamhr99NNPKi4u1hVXXNHg4nANIbAAAM5ITU2N6urqFBkZqXbt2rX0cGCYtm3bys/PT3v37lVNTY3sdnuzjsNFtwCAs6K5/88Z3u9sfG/w3QUAAIxHYAEAAMbjGhYAwDmzbueP5/XzhvQMO6+f1xzdunVTenq60tPTz9lnrF+/XjfccIP++c9/KiQk5Jx9zvlEYAEA4Dz64osvFBgY2NLDaHUILAAAnAU1NTVNWmekU6dO52E03odrWAAAF6w33nhDvXv3Vtu2bdWxY0cNGTJEhw8f1uDBg11O2YwYMUITJkxwvO/WrZsee+wxTZgwQcHBwZo8ebLi4+P14IMPOu33008/yc/PTx9//LFjv+zsbEnSmDFjdOeddzr1P378uEJDQ7V06VJJJ9cyefrppxUdHa22bduqb9++euONN5z2ycvL05VXXqm2bdvqhhtu0A8//HDmXxzDMMMC77b7vYa3X5V8fsYBwDhlZWUaM2aMnn76af3mN7/RoUOHtHHjRlmW1eRjPPPMM3r44Yf10EMPSZLef/99PfPMM8rKynIsnpebm6uwsDAlJia67J+SkqI77rhDP//8s4KCgiRJH3zwgQ4fPqyRI0dKkh566CGtWbNGixYt0hVXXKFPPvlEY8eOVadOnZSYmKjS0lLdfvvtSktL0z333KMtW7boj3/845l+eYxDYAEAXJDKysp04sQJ3X777erataskqXfv3h4d48Ybb9R9993neD969GhlZGTo008/VUJCgiRp5cqVuuuuu9yuRTJs2DAFBgbqzTff1Lhx4xz9b731VnXo0EGHDx/WvHnz9NFHHyk+Pl6SFB0drU8//VR/+tOflJiYqEWLFik6OlrPPfecbDabrrrqKm3fvl1PPfVUs74upuKUEADggtS3b1/ddNNN6t27t0aNGqXFixfrn//8p0fHiIuLc3rfqVMnDR06VCtWrJAkFRcXq6CgQCkpKW739/Pz06hRoxz9Dx8+rLffftvRf+fOnTp69KiGDh2qoKAgx2v58uX67rvvJEm7du3Stdde6/Q4hFPhxpswwwIAuCD5+PgoPz9fmzZt0tq1a/XCCy9o5syZ2rx5s9q0aeNyauj48eMux3B3t09KSoqmTZumF154QStXrtTVV1+tvn371juOlJQUJSYmqqKiQvn5+bLb7UpOPnm6uq6uTpL07rvv6tJLL3XaLyAgQJI8OoXVmjHDAgC4YNlsNg0aNEiPPPKICgsL5e/vrzfffFOdOnVSWVmZo19tba2+/vrrJh1zxIgROnr0qN5//32tXLlSY8eObbD/wIEDFRkZqdzcXK1YsUKjRo1y3G3Us2dPBQQEqKSkRJdffrnTKzIy0tHns88+czrm6e+9ATMsAIAL0ubNm/Xhhx8qKSlJl1xyiTZv3qyffvpJMTExCgwMVGZmpt599111795dzz33nA4ePNik4wYGBuq2227Tww8/rF27dumuu+5qsL/NZtNdd92lnJwc7dmzx3E3kSS1b99e9913nzIyMlRXV6frrrtO1dXV2rRpk4KCgjR+/HilpaXp2WefVWZmpn7/+99r69atWrZs2Rl8ZcxEYAEAnDMmrzzboUMHffLJJ8rOzlZ1dbW6du2qZ599VsnJyTp+/Li+/PJL3X333fL19VVGRoZuuOGGJh87JSVFN998s66//np16dKlSf2feOIJde3aVYMGDXLa9uijj+qSSy5RVlaWvv/+e4WEhOhXv/qVZsyYIUnq0qWLVq9erYyMDC1cuFDXXHONnnjiCU2cONGzL4jhbJaXnPyqrq5WcHCwqqqq1KFDh5YeDkzBbc3AOXf06FEVFxcrKipKdru9pYcDAzX0PdLUv9/NuoZl4cKFjg+NjY3Vxo0bG+y/YcMGxcbGym63Kzo6Wjk5OU7bly1bJpvN5vI6evRoc4YHAAC8jMeBJTc3V+np6Zo5c6YKCwuVkJCg5ORklZSUuO1fXFys4cOHKyEhQYWFhZoxY4amTp2q1atXO/Xr0KGDysrKnF4kdQAAIDXjGpZ58+Zp0qRJSk1NlSRlZ2frgw8+0KJFi5SVleXSPycnR126dHEsQxwTE6MtW7Zo7ty5jlX8pJMXHYWHhzezDAAA4M08mmGpqanR1q1blZSU5NSelJSkTZs2ud2noKDApf+wYcO0ZcsWp3vaf/75Z3Xt2lWXXXaZbrnlFhUWFjY4lmPHjqm6utrpBQAAvJNHgaWyslK1tbUKC3O+6jssLEzl5eVu9ykvL3fb/8SJE6qsrJQk9ejRQ8uWLdM777yjVatWyW63a9CgQfrmm2/qHUtWVpaCg4Mdr1P3owMAAO/TrItuf7n8r3Rylb3T2xrr/8v2a6+9VmPHjlXfvn2VkJCg//7v/9aVV16pF154od5jTp8+XVVVVY5XaWlpc0oBAACtgEfXsISGhsrHx8dlNqWiosJlFuWU8PBwt/19fX3VsWNHt/u0adNGAwYMaHCGJSAgwLEsMQAA8G4ezbD4+/srNjZW+fn5Tu35+fkaOHCg233i4+Nd+q9du1ZxcXHy8/Nzu49lWSoqKlLnzp09GR4AAPBSHp8SyszM1Msvv6xXXnlFu3btUkZGhkpKSpSWlibp5Kmau+++29E/LS1Ne/fuVWZmpnbt2qVXXnlFS5YscXoc9yOPPKIPPvhA33//vYqKijRp0iQVFRU5jgkAAJpn8ODBSk9PP6ef8cMPP8hms6moqOicfYbHtzWPHj1aBw4c0Jw5c1RWVqZevXopLy9PXbt2lSSVlZU5rckSFRWlvLw8ZWRkaMGCBYqIiND8+fOdbmk+ePCgfve736m8vFzBwcHq37+/PvnkE11zzTVnoUQAQItpbLXps60FVq+ePXu23nrrrXP6x/pMrFmzpt4zGq1Js54lNGXKFE2ZMsXtNncPXEpMTNS2bdvqPd5zzz2n5557rjlDAQDgglRTU+N4qnNDLr744vMwmnOvWXcJAQDgDQYPHqypU6fq/vvv18UXX6zw8HDNnj3bqU9JSYluu+02BQUFqUOHDrrjjjv0448/Sjr5f9IfeeQRffnll47HytT3pOT169frmmuuUWBgoEJCQjRo0CDt3btXkjRhwgSNGDHCqX96eroGDx7sNNZ7771XmZmZCg0N1dChQzVmzBjdeeedTvsdP35coaGhWrp0qWO/U6eEpk+frmuvvdZlbH369NGsWbMc75cuXaqYmBjZ7Xb16NFDCxcudOr/+eefq3///rLb7YqLi2t07bSzgac1AwAuaH/+85+VmZmpzZs3q6CgQBMmTNCgQYM0dOhQWZalESNGKDAwUBs2bNCJEyc0ZcoUjR49WuvXr9fo0aP19ddf6/3339e6deskScHBwS6fceLECY0YMUKTJ0/WqlWrVFNTo88//7zBJUHqG+s999yjv/3tb7IsS99++63uuOMO/fzzzwoKCpIkffDBBzp8+LDTpRenpKSk6Mknn9R3332n7t27S5J27Nih7du364033pAkLV68WLNmzdKLL76o/v37q7CwUJMnT1ZgYKDGjx+vw4cP65ZbbtGNN96o1157TcXFxZo2bZpHdTQHgQUAcEH75ezCFVdcoRdffFEffvihhg4dqnXr1umrr75ScXGxY4HSV199VVdffbW++OILDRgwQEFBQfL19W3w8TLV1dWqqqrSLbfc4ggKMTExHo/18ssv19NPP+143717dwUGBurNN9/UuHHjJEkrV67Urbfe6vbJx7169VKfPn20cuVKPfzww5KkFStWaMCAAbryyislSY8++qieffZZ3X777ZJOXou6c+dO/elPf9L48eO1YsUK1dbW6pVXXlG7du109dVX6+9//7vuuecej+vxBKeEAAAXtD59+ji979y5syoqKiRJu3btUmRkpNNq6j179lRISIh27drV5M+4+OKLNWHCBA0bNky33nqrnn/+eZWVlXk81ri4OKf3fn5+GjVqlFasWCFJOnz4sN5++22lpKTUe4yUlBRHf8uytGrVKkf/n376SaWlpZo0aZKCgoIcr8cee0zfffedpJNfk759+6pdu3aOY8bHx3tci6cILACAC9rpd9DYbDbV1dVJqn8l98ZWeHdn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v/xSn376qYYPHy6p5f8Nm/W0Zm9VWVmp2tpal4cuhoWFuTyc0RucqsldvXv37m2JIZ0Ry7KUmZmp6667Tr169ZLkPTVu375d8fHxOnr0qIKCgvTmm2+qZ8+ejl8Srb2+119/Xdu2bdMXX3zhss0b/g1//etfa/ny5bryyiv1448/6rHHHtPAgQO1Y8cOr6hPkr7//nstWrRImZmZmjFjhj7//HNNnTpVAQEBuvvuu72mzlPeeustHTx4UBMmTJDkHd+nDzzwgKqqqtSjRw/5+PiotrZWjz/+uMaMGSOp5WsksLhhs9mc3luW5dLmTbyl3nvvvVdfffWV22dQtfYar7rqKhUVFengwYNavXq1xo8frw0bNji2t+b6SktLNW3aNK1du1Z2u73efq25xuTkZMd/9+7dW/Hx8erevbv+/Oc/69prr5XUuuuTpLq6OsXFxemJJ56QJPXv3187duzQokWLdPfddzv6tfY6T1myZImSk5MVERHh1N6a68vNzdVrr72mlStX6uqrr1ZRUZHS09MVERGh8ePHO/q1VI2cEvqF0NBQ+fj4uMymVFRUuCRKb3DqLgVvqPc///M/9c477+jjjz/WZZdd5mj3lhr9/f11+eWXKy4uTllZWerbt6+ef/55r6hv69atqqioUGxsrHx9feXr66sNGzZo/vz58vX1ddTRmms8XWBgoHr37q1vvvnGK/4NJalz587q2bOnU1tMTIzj2XLeUqck7d27V+vWrVNqaqqjzRvq+6//+i89+OCDuvPOO9W7d2+NGzdOGRkZysrKktTyNRJYfsHf31+xsbHKz893as/Pz9fAgQNbaFTnTlRUlMLDw53qramp0YYNG1pNvZZl6d5779WaNWv00UcfKSoqymm7N9TojmVZOnbsmFfUd9NNN2n79u0qKipyvOLi4pSSkqKioiJFR0e3+hpPd+zYMe3atUudO3f2in9DSRo0aJDLkgJ79uxxPBjXW+qUpKVLl+qSSy7RzTff7GjzhvqOHDmiNm2cY4GPj4/jtuYWr/GcX9bbypy6rXnJkiXWzp07rfT0dCswMND64YcfWnpozXLo0CGrsLDQKiwstCRZ8+bNswoLCx23aT/55JNWcHCwtWbNGmv79u3WmDFjWtVtePfcc48VHBxsrV+/3ul2wyNHjjj6tPYap0+fbn3yySdWcXGx9dVXX1kzZsyw2rRpY61du9ayrNZfnzu/vEvIslp/jX/84x+t9evXW99//7312WefWbfccovVvn17x++V1l6fZZ28Jd3X19d6/PHHrW+++cZasWKF1a5dO+u1115z9PGGOmtra60uXbpYDzzwgMu21l7f+PHjrUsvvdRxW/OaNWus0NBQ6/7773f0ackaCSxuLFiwwOratavl7+9v/epXv3LcItsaffzxx5Ykl9f48eMtyzp5m9qsWbOs8PBwKyAgwLr++uut7du3t+ygPeCuNknW0qVLHX1ae40TJ050fD926tTJuummmxxhxbJaf33unB5YWnuNp9aq8PPzsyIiIqzbb7/d2rFjh2N7a6/vlL/+9a9Wr169rICAAKtHjx7WSy+95LTdG+r84IMPLEnW7t27Xba19vqqq6utadOmWV26dLHsdrsVHR1tzZw50zp27JijT0vWaLMsyzr38zgAAADNxzUsAADAeAQWAABgPAILAAAwHoEFAAAYj8ACAACMR2ABAADGI7AAAADjEVgAAIDxCCwAAMB4BBYAAGA8AgsAADAegQUAABjv/wGn9w5t8ZFUCAAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 640x480 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "mask_survived = (train_df['Survived'] == 1)\n",
    "mask_not_survived = (train_df['Survived'] == 0)\n",
    "\n",
    "plt.figure()\n",
    "plt.hist(train_df[mask_survived]['Age'], density = True, bins = 50, alpha = 0.3, label = 'survived')\n",
    "plt.hist(train_df[mask_not_survived]['Age'], density = True, bins = 50, alpha = 0.3, label = 'not survived')\n",
    "plt.legend()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "id": "be60d041-5505-479c-baec-e2752b8b9913",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "0.6129032258064516\n",
      "0.38650306748466257\n"
     ]
    }
   ],
   "source": [
    "# 检查10岁以下是否对Survived有显著影响\n",
    "print(train_df[train_df['Age'] < 10]['Survived'].mean())\n",
    "print(train_df[train_df['Age'] >= 10]['Survived'].mean())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "id": "29aa479f-6e35-4b1a-8b32-49f6dd66de84",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成Age<10特征\n",
    "train_df.loc[(train_df['Age'] < 10), 'Age<10'] = 1\n",
    "train_df.loc[~(train_df['Age'] < 10), 'Age<10'] = 0\n",
    "test_df.loc[(test_df['Age'] < 10), 'Age<10'] = 1\n",
    "test_df.loc[~(test_df['Age'] < 10), 'Age<10'] = 0"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "id": "e216ebe5-5207-4318-ad8e-815e01156cc0",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.2937853107344633"
      ]
     },
     "execution_count": 25,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查Age缺失值是否对Survived有影响\n",
    "train_df[train_df['Age'].isnull()]['Survived'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "id": "1452d77f-0b67-4f87-8585-c77597d78e0c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成Age-isNull特征\n",
    "train_df['Age-isNull'] = train_df['Age'].isnull().astype(int)\n",
    "test_df['Age-isNull'] = test_df['Age'].isnull().astype(int)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "id": "67109a15-6eef-4cad-8a96-f586bc5356f4",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 检查Age为估计值是否对Survived有影响\n",
    "def is_estimated_age(age):\n",
    "    if np.isnan(age) or age < 1:\n",
    "        return 0\n",
    "    if age == int(age):\n",
    "        return 0\n",
    "    return 1\n",
    "\n",
    "# 生成Age-isEstimated特征\n",
    "train_df['Age-isEstimated'] = train_df['Age'].apply(is_estimated_age)\n",
    "test_df['Age-isEstimated'] = test_df['Age'].apply(is_estimated_age)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 28,
   "id": "fe27da5e-c01f-4c93-a68a-c98853949ebc",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Age&lt;10</th>\n",
       "      <th>Age-isNull</th>\n",
       "      <th>Age-isEstimated</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>22.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>38.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>26.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>35.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>35.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Age  Age<10  Age-isNull  Age-isEstimated\n",
       "0  22.0     0.0           0                0\n",
       "1  38.0     0.0           0                0\n",
       "2  26.0     0.0           0                0\n",
       "3  35.0     0.0           0                0\n",
       "4  35.0     0.0           0                0"
      ]
     },
     "execution_count": 28,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df[[col for col in train_df.columns if 'Age' in col]].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 29,
   "id": "bb642e12-e771-40b5-a1f0-300cd8bee0ff",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Age&lt;10</th>\n",
       "      <th>Age-isNull</th>\n",
       "      <th>Age-isEstimated</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.5</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>47.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>62.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>27.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Age  Age<10  Age-isNull  Age-isEstimated\n",
       "0  34.5     0.0           0                1\n",
       "1  47.0     0.0           0                0\n",
       "2  62.0     0.0           0                0\n",
       "3  27.0     0.0           0                0\n",
       "4  22.0     0.0           0                0"
      ]
     },
     "execution_count": 29,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df[[col for col in test_df.columns if 'Age' in col]].head()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "66ec47d5-0f8f-4365-94ae-297808c6aa6c",
   "metadata": {
    "tags": []
   },
   "source": [
    "### 2.3 SibSp / Parch"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "id": "7fb9d1ef-9953-4999-a2c4-ed07dec40c59",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4664310954063604"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# SibSp\n",
    "train_df[train_df['SibSp'] > 0]['Survived'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 31,
   "id": "57169e96-cbfb-4ff4-9313-706814e3d048",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5117370892018779"
      ]
     },
     "execution_count": 31,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Parch\n",
    "train_df[train_df['Parch'] > 0]['Survived'].mean()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "296fbf3d-8497-4d38-b4de-03458858e08a",
   "metadata": {},
   "source": [
    "### 2.4 Ticket"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "id": "9bb694d6-7c62-4f32-a87c-0bd8ec6e67cf",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.49047619047619045"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查重复的Ticket是否对Survived有影响\n",
    "train_df[train_df['Ticket'].duplicated()]['Survived'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "id": "3ae630d7-76f7-4c71-a9b7-e18746648d24",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成Ticket-isDuplicated特征\n",
    "train_df['Ticket-isDuplicated'] = train_df['Ticket'].duplicated().astype(int)\n",
    "test_df['Ticket-isDuplicated'] = test_df['Ticket'].duplicated().astype(int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "111f0280-0a41-4515-9d2e-a44e154b9845",
   "metadata": {},
   "source": [
    "### 2.5 Cabin"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 34,
   "id": "42d3ab0f-a1d2-4ee6-82ef-d866074e6ea4",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.29985443959243085"
      ]
     },
     "execution_count": 34,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查为Null的Cabin是否对Survived有影响\n",
    "train_df[train_df['Cabin'].isnull()]['Survived'].mean()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "id": "a4097a8b-5492-4c06-ab02-a90e48951d23",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 生成Cabin==Null特征\n",
    "train_df['Cabin==Null'] = train_df['Cabin'].isnull().astype(int)\n",
    "test_df['Cabin==Null'] = test_df['Cabin'].isnull().astype(int)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "9a5851c7-cc31-4e74-84f4-f8e3d03eb088",
   "metadata": {},
   "source": [
    "### 2.6 Embarked"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "id": "e7943e51-ffa3-4255-82ba-05549019bd51",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Embarked</th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>C</th>\n",
       "      <td>0.553571</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Q</th>\n",
       "      <td>0.389610</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>S</th>\n",
       "      <td>0.336957</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "          Survived\n",
       "Embarked          \n",
       "C         0.553571\n",
       "Q         0.389610\n",
       "S         0.336957"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 检查Embarked是否对Survived有影响\n",
    "(train_df\n",
    "     .groupby('Embarked')\n",
    "     .agg({'Survived': np.mean}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "id": "9b025fa4-664c-4863-80d2-c2934f1b9dba",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对C和Q生成二值变量\n",
    "train_df[['Embarked==C', 'Embarked==Q']] = pd.get_dummies(train_df['Embarked'])[['C', 'Q']]\n",
    "test_df[['Embarked==C', 'Embarked==Q']] = pd.get_dummies(test_df['Embarked'])[['C', 'Q']]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "aeb41a50-657f-4096-8967-a8000eb2dc1a",
   "metadata": {},
   "source": [
    "### 2.7 Name"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "id": "42fb2d2a-df4f-401f-9bb6-828f41411931",
   "metadata": {},
   "outputs": [],
   "source": [
    "def extract_title(name):\n",
    "    title_pattern = r'(, )([\\w]+)(.)'\n",
    "    # name = 'Heikkinen, Miss. Laina'\n",
    "    return re.findall(title_pattern, name)[0][1] "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "id": "11b92bf2-5571-45d4-8303-293be5ad028f",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>% of Survival</th>\n",
       "      <th>COUNT</th>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Name-Title</th>\n",
       "      <th></th>\n",
       "      <th></th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>Capt</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Col</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Don</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Dr</th>\n",
       "      <td>0.428571</td>\n",
       "      <td>7</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Jonkheer</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Lady</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Major</th>\n",
       "      <td>0.500000</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Master</th>\n",
       "      <td>0.575000</td>\n",
       "      <td>40</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Miss</th>\n",
       "      <td>0.697802</td>\n",
       "      <td>182</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mlle</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mme</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mr</th>\n",
       "      <td>0.156673</td>\n",
       "      <td>517</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Mrs</th>\n",
       "      <td>0.792000</td>\n",
       "      <td>125</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Ms</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Rev</th>\n",
       "      <td>0.000000</td>\n",
       "      <td>6</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>Sir</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>the</th>\n",
       "      <td>1.000000</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "            % of Survival  COUNT\n",
       "Name-Title                      \n",
       "Capt             0.000000      1\n",
       "Col              0.500000      2\n",
       "Don              0.000000      1\n",
       "Dr               0.428571      7\n",
       "Jonkheer         0.000000      1\n",
       "Lady             1.000000      1\n",
       "Major            0.500000      2\n",
       "Master           0.575000     40\n",
       "Miss             0.697802    182\n",
       "Mlle             1.000000      2\n",
       "Mme              1.000000      1\n",
       "Mr               0.156673    517\n",
       "Mrs              0.792000    125\n",
       "Ms               1.000000      1\n",
       "Rev              0.000000      6\n",
       "Sir              1.000000      1\n",
       "the              1.000000      1"
      ]
     },
     "execution_count": 38,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_df['Name-Title'] = train_df['Name'].apply(extract_title)\n",
    "(train_df\n",
    "     .groupby('Name-Title')\n",
    "     .agg({'Survived': np.mean,\n",
    "           'PassengerId': 'count'})\n",
    "     .rename(columns = {'Survived': '% of Survival', \n",
    "                        'PassengerId': 'COUNT'}))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "id": "289e5aeb-f1b8-4438-946f-caca4e0ad163",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Cabin</th>\n",
       "      <th>Embarked</th>\n",
       "      <th>Sex==Female</th>\n",
       "      <th>Age&lt;10</th>\n",
       "      <th>Age-isNull</th>\n",
       "      <th>Age-isEstimated</th>\n",
       "      <th>Ticket-isDuplicated</th>\n",
       "      <th>Cabin==Null</th>\n",
       "      <th>Name-Title</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>7</th>\n",
       "      <td>8</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Palsson, Master. Gosta Leonard</td>\n",
       "      <td>male</td>\n",
       "      <td>2.0</td>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>349909</td>\n",
       "      <td>21.0750</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>Master</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>16</th>\n",
       "      <td>17</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Rice, Master. Eugene</td>\n",
       "      <td>male</td>\n",
       "      <td>2.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>382652</td>\n",
       "      <td>29.1250</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Q</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>Master</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>50</th>\n",
       "      <td>51</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Panula, Master. Juha Niilo</td>\n",
       "      <td>male</td>\n",
       "      <td>7.0</td>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>3101295</td>\n",
       "      <td>39.6875</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>Master</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>59</th>\n",
       "      <td>60</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Goodwin, Master. William Frederick</td>\n",
       "      <td>male</td>\n",
       "      <td>11.0</td>\n",
       "      <td>5</td>\n",
       "      <td>2</td>\n",
       "      <td>CA 2144</td>\n",
       "      <td>46.9000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "      <td>0</td>\n",
       "      <td>0.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>Master</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>63</th>\n",
       "      <td>64</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Skoog, Master. Harald</td>\n",
       "      <td>male</td>\n",
       "      <td>4.0</td>\n",
       "      <td>3</td>\n",
       "      <td>2</td>\n",
       "      <td>347088</td>\n",
       "      <td>27.9000</td>\n",
       "      <td>NaN</td>\n",
       "      <td>S</td>\n",
       "      <td>0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>Master</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    PassengerId  Survived  Pclass                                Name   Sex  \\\n",
       "7             8         0       3      Palsson, Master. Gosta Leonard  male   \n",
       "16           17         0       3                Rice, Master. Eugene  male   \n",
       "50           51         0       3          Panula, Master. Juha Niilo  male   \n",
       "59           60         0       3  Goodwin, Master. William Frederick  male   \n",
       "63           64         0       3               Skoog, Master. Harald  male   \n",
       "\n",
       "     Age  SibSp  Parch   Ticket     Fare Cabin Embarked  Sex==Female  Age<10  \\\n",
       "7    2.0      3      1   349909  21.0750   NaN        S            0     1.0   \n",
       "16   2.0      4      1   382652  29.1250   NaN        Q            0     1.0   \n",
       "50   7.0      4      1  3101295  39.6875   NaN        S            0     1.0   \n",
       "59  11.0      5      2  CA 2144  46.9000   NaN        S            0     0.0   \n",
       "63   4.0      3      2   347088  27.9000   NaN        S            0     1.0   \n",
       "\n",
       "    Age-isNull  Age-isEstimated  Ticket-isDuplicated  Cabin==Null Name-Title  \n",
       "7            0                0                    0            1     Master  \n",
       "16           0                0                    0            1     Master  \n",
       "50           0                0                    0            1     Master  \n",
       "59           0                0                    0            1     Master  \n",
       "63           0                0                    0            1     Master  "
      ]
     },
     "execution_count": 39,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Master头衔，全是Male，但获救概率很高\n",
    "train_df[train_df['Name'].apply(lambda x: True if 'Master' in x else False)].head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 49,
   "id": "4adc1999-a38c-42d7-87ec-6ce1b0fe5e7c",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 对Master, Miss, Mr, Mrs生成二值变量，其余归为Other\n",
    "train_df[['Name-Title==Master',\n",
    "          'Name-Title==Miss',\n",
    "          'Name-Title==Mr',\n",
    "          'Name-Title==Mrs']] = pd.get_dummies(train_df['Name-Title'])[['Master', 'Miss', 'Mr', 'Mrs']]\n",
    "\n",
    "test_df['Name-Title'] = test_df['Name'].apply(extract_title)\n",
    "test_df[['Name-Title==Master',\n",
    "          'Name-Title==Miss',\n",
    "          'Name-Title==Mr',\n",
    "          'Name-Title==Mrs']] = pd.get_dummies(test_df['Name-Title'])[['Master', 'Miss', 'Mr', 'Mrs']]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "ab15593f-1447-419e-b38e-406625290523",
   "metadata": {},
   "source": [
    "## 3. 训练模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 52,
   "id": "526b1da0-e23b-49bc-8d2a-f032a60b6900",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 891 entries, 0 to 890\n",
      "Data columns (total 23 columns):\n",
      " #   Column               Non-Null Count  Dtype  \n",
      "---  ------               --------------  -----  \n",
      " 0   PassengerId          891 non-null    int64  \n",
      " 1   Survived             891 non-null    int64  \n",
      " 2   Pclass               891 non-null    int64  \n",
      " 3   Name                 891 non-null    object \n",
      " 4   Sex                  891 non-null    object \n",
      " 5   Age                  714 non-null    float64\n",
      " 6   SibSp                891 non-null    int64  \n",
      " 7   Parch                891 non-null    int64  \n",
      " 8   Ticket               891 non-null    object \n",
      " 9   Fare                 891 non-null    float64\n",
      " 10  Cabin                204 non-null    object \n",
      " 11  Embarked             889 non-null    object \n",
      " 12  Sex==Female          891 non-null    uint8  \n",
      " 13  Age<10               891 non-null    float64\n",
      " 14  Age-isNull           891 non-null    int64  \n",
      " 15  Age-isEstimated      891 non-null    int64  \n",
      " 16  Ticket-isDuplicated  891 non-null    int64  \n",
      " 17  Cabin==Null          891 non-null    int64  \n",
      " 18  Name-Title           891 non-null    object \n",
      " 19  Name-Title==Master   891 non-null    uint8  \n",
      " 20  Name-Title==Miss     891 non-null    uint8  \n",
      " 21  Name-Title==Mr       891 non-null    uint8  \n",
      " 22  Name-Title==Mrs      891 non-null    uint8  \n",
      "dtypes: float64(3), int64(9), object(6), uint8(5)\n",
      "memory usage: 129.8+ KB\n"
     ]
    }
   ],
   "source": [
    "train_df.info()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "id": "adbcf097-7955-49e3-8de2-b99890d844af",
   "metadata": {},
   "outputs": [],
   "source": [
    "features = ['Pclass', 'Sex==Female', 'SibSp', 'Parch',\n",
    "            'Age<10', 'Age-isNull', 'Age-isEstimated',\n",
    "            'Ticket-isDuplicated', 'Fare', 'Cabin==Null',\n",
    "            'Embarked==C', 'Embarked==Q']\n",
    "# 加入Age衍生的特征\n",
    "# features += [col for col in train_df.columns if 'Age' in col]\n",
    "# 加入Name-Title衍生的特征\n",
    "features += [col for col in train_df.columns if 'Name-Title==' in col]\n",
    "\n",
    "X = train_df[features]\n",
    "y = train_df[['Survived']]"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 93,
   "id": "23c06f6b-615e-4f7f-8936-eca9ce9f1d17",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8071748878923767"
      ]
     },
     "execution_count": 93,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 2)\n",
    "\n",
    "rf_clf = DecisionTreeClassifier(criterion = 'entropy', random_state = 10).fit(X_train, y_train)\n",
    "\n",
    "y_pred = rf_clf.predict(X_test)\n",
    "accuracy_score(y_pred, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "id": "458cdd8c-0bce-4a16-b9d8-03175532f058",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.7757847533632287"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "features_null = ['Pclass', 'Sex==Female', \n",
    "                 'SibSp', 'Parch', 'Fare',\n",
    "                 'Embarked==C', 'Embarked==Q']\n",
    "\n",
    "X = train_df[features_null]\n",
    "y = train_df['Survived']\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, random_state = 2)\n",
    "\n",
    "rf_clf = DecisionTreeClassifier(criterion = 'entropy', random_state = 10).fit(X_train, y_train)\n",
    "\n",
    "y_pred = rf_clf.predict(X_test)\n",
    "accuracy_score(y_pred, y_test)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "391b4546-927a-448f-b735-59a78420203b",
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
